package br.com.sms.email;

import java.util.Properties;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import br.com.sms.excecao.SmsException;
import br.com.sms.util.MensagensErro;

public class SendMail {

        private String mailSMTPServer = "smtp.smssmart.com.br";
        private String mailSMTPServerPort = "465";
        private String userEmail = "desenvolvimento@smssmart.com.br";
        private String senhaEmail = "smart1218";

        /*
         * quando instanciar um Objeto ja sera atribuido o servidor SMTP do GMAIL 
         * e a porta usada por ele
         */
        public SendMail () { //Para o GMAIL 
        }
        /*
         * caso queira mudar o servidor e a porta, so enviar para o contrutor
         * os valor como string
         */
        public SendMail (String mailSMTPServer, String mailSMTPServerPort) { //Para outro Servidor
                this.mailSMTPServer = mailSMTPServer;
                this.mailSMTPServerPort = mailSMTPServerPort;
        }

        public void sendMail(Address[] destinatarios, String subject, String message) throws SmsException {

                Properties props = new Properties();

                // quem estiver utilizando um SERVIDOR PROXY descomente essa parte e atribua as propriedades do SERVIDOR PROXY utilizado
              
                /*props.setProperty("proxySet","true");
                props.setProperty("socksProxyHost","http://anonymouse.ws"); // IP do Servidor Proxy
                props.setProperty("socksProxyPort","8080");  // Porta do servidor Proxy
                */

                props.put("mail.transport.protocol", "smtp"); //define protocolo de envio como SMTP
                props.put("mail.smtp.starttls.enable","true"); 
                props.put("mail.smtp.host", mailSMTPServer); //server SMTP do GMAIL
                props.put("mail.smtp.auth", "true"); //ativa autenticacao
                props.put("mail.smtp.user", userEmail); //usuario ou seja, a conta que esta enviando o email (tem que ser do GMAIL)
                props.put("mail.debug", "true");
                props.put("mail.smtp.port", mailSMTPServerPort); //porta
                props.put("mail.smtp.socketFactory.port", mailSMTPServerPort); //mesma porta para o socket
                props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
                props.put("mail.smtp.socketFactory.fallback", "false");

                //Cria um autenticador que sera usado a seguir
                Autenticacao auth = null;
                auth = new Autenticacao(userEmail,senhaEmail);

                //Session - objeto que ira realizar a conexão com o servidor
                /*Como há necessidade de autenticação é criada uma autenticacao que
                 * é responsavel por solicitar e retornar o usuário e senha para 
                 * autenticação */
                Session session = Session.getDefaultInstance(props, auth);
                session.setDebug(true); //Habilita o LOG das ações executadas durante o envio do email

                //Objeto que contém a mensagem
                Message msg = new MimeMessage(session);

                try {
						//Setando o destinatário
                        msg.setRecipients(RecipientType.BCC, destinatarios);
                        //Setando a origem do email
                        msg.setFrom(new InternetAddress(userEmail));
                        //Setando o assunto
                        msg.setSubject(subject);
                        //Setando o conteúdo/corpo do email
                        msg.setContent(message,"text/html; charset=UTF-8");

                } catch (Exception e) {
                        System.out.println(">> Erro: Completar Mensagem");
                        e.printStackTrace();
                }

                //Objeto encarregado de enviar os dados para o email
                Transport tr;
                try {
                        tr = session.getTransport("smtp"); //define smtp para transporte
                        /*
                         *  1 - define o servidor smtp
                         *  2 - seu nome de usuario do gmail
                         *  3 - sua senha do gmail
                         */
                        tr.connect(mailSMTPServer, userEmail, senhaEmail);
                        msg.saveChanges(); // don't forget this
                        //envio da mensagem
                        tr.sendMessage(msg, msg.getAllRecipients());
                        tr.close();
                } catch (Exception e) {
                       throw new SmsException(MensagensErro.ERRO_CONEXAO_EMAIL);
                }

        }
}
